「關於函式的首要準則,就是要簡短。第二項準則,就是要比第一項的簡短函式還要更簡短。這是一個我無法證明的主張」。
作者提到的這句話我深感認同,函式就是要跟uber eat的等待時間一點越短越好,越短的函式通常擁有兩個特點,1. 只做一件事 2. 易讀
一個函式的參數跟存款不一樣,不是越多越好,1 ~ 2個會是最好的情況,
當你有太多的參數,使用物件會是一個解決大量參數有效的做法
//Bad
function createArticle(title, content, author, date){
// ...
}
//Better
function createArticle({title, content, author, date}){
//...
}
用物件還有一個好處,就是可以使用解構(Destructuring)的方式,function只拿到物件中自己需要的屬性,而且解構語法還會避免動到原始資料而產生Side Effect
畫線,重要,這會考,不管在什麼時候,在撰寫任何function時,讓他只有一個功能,會有以下好處
//Bad
function emailClients(clients) {
clients.forEach(client => {
const clientRecord = database.lookup(client);
if (clientRecord.isActive()) {
email(client);
}
});
}
//Better
function emailActiveClients(clients) {
clients.filter(isActiveClient).forEach(email);
}
function isActiveClient(client) {
const clientRecord = database.lookup(client);
return clientRecord.isActive();
}
大家第一次聽到螞蟻上樹的時候覺得他是什麼呢?名稱真的很重要。
至少讓別人一看就知道這個function大概在做什麼
//Bad
function check(email) {
// ...
}
check("eamil@email.com")
//Better
function checkEmailExist(email){
//...
}
checkEmailExist("eamil@email.com")
另外函數命名可以用動詞開頭來開頭,讓他跟英文文法相符 ex : doSomething()
為什麼所有語言都在提倡不重複這件事呢?
重複的程式碼代表著更動邏輯時,要改很多地方,就像在寫css 同樣的元件你不小心寫了四種一樣的class ,改的時候發現有些頁面的沒改到,很惱人
//Bad
function showTeacherList(teachers) {
teachers.forEach(teacher => {
const name = teacher.getName();
const age = teacher.getAge();
const salary = teacher.getSalary();
const data = {
name,
age,
salary
};
render(data);
});
}
function showStudentList(students) {
students.forEach(student => {
const Name = student.getName();
const Age = student.getAge();
const score = student.getScore();
const data = {
name,
age,
score
};
render(data);
});
}
//Better
function showUserList(users){
users.forEach(user => {
const name = user.getName();
const age = user.getAge();
const data = {
name,
age
};
switch (user.type) {
case 'teacher':
data.salary = user.getSalary();
break;
case 'student':
data.score = user.getScore();
break;
}
render(data);
});
}
當函數作用在除了回傳值外的地方,像是讀寫文件、修改全域變數或是吃藥然後想睡覺,稱為副作用。
程式在某些情況下是需要副作用的,像是上面所提到的例子。這時你應該將這些功能集中在一起,不要同時有多個函數或是類別同時操作資源,應該只用一個服務(Service)完成這些事情。
常見的問題像是:
如果你能避免這些問題,你會比大多數的工程師快樂。
// 全域變數被以下函數使用
// 假如有其他的函數使用了這個名稱,現在他變成了陣列,將會被破壞而出錯。
let name = 'Dylan Chen';
function splitIntoFirstAndLastName() {
name = name.split(' ');
}
splitIntoFirstAndLastName();
console.log(name); // ['Dylan', 'Chen'];
適當的:
function splitIntoFirstAndLastName(name) {
return name.split(' ');
}
const name = 'Dylan Chen';
const newName = splitIntoFirstAndLastName(name);
console.log(name); // 'Dylan Chen';
console.log(newName); // ['Dylan', 'Chen'];
function要注意的東西太多了,明天繼續補充 ~